前幾天從類別開始接續講了介面與抽象化,讓我們把 Kolin 裡類別的最後幾塊拼圖補上,先從 data class
開始吧!
在Kotlin中,data class
是一種特殊的類型,主要用於儲存數值。它內建了一些擴充函式例如:equals()
、hashCode()
、toString()
和 copy()
。它非常適合用來解決只儲存簡單數值的類別,例如:DTO(數據傳輸對象)。下面我們演示如何使用 data class
:
// 定義一個data class,表示一個簡單的人物
data class Person(val name: String, val age: Int)
fun main() {
// 創建一個Person對象
val person1 = Person("Alice", 30)
println(person1) // 輸出: Person(name=Alice, age=30)
// 使用自動生成的equals()方法進行比較
val person2 = Person("Alice", 30)
println(person1 == person2) // 輸出: true
// 解構賦值
val (name, age) = person1
println("姓名:$name,年齡:$age") // 輸出: 姓名:Alice,年齡:30
}
從上面範例讀者可能會想問:為什麼宣告要用 val
呢?我不能用 var
嗎?答案是可以喔!我們看下面範例:
data class Person(var name: String, val age: Int)
fun main() {
// 創建一個Person對象
val person1 = Person("Alice", 30)
println(person1) // 輸出: Person(name=Alice, age=30)
person1.name = "John"
val (name, age) = person1
println("姓名:$name,年齡:$age") // 輸出: 姓名:John,年齡:30
}
忽略上面有些不必要的解構部分,你可以看到我用 var
也是可以通的。但是這裡就會牽扯到之後會提到 Functional Programming 的不可變性 (前面其實有說過這塊XD),所以通常來說都會使用 val
去定義 data class
。
那這時候讀者一定會說:所以你今天介紹了一種類別,然後你告訴我:好喔!這玩意兒賦值後就不能修改!?先別急,如果我們期望對一個 data class
進行修改,我們其實可以像下方範例這樣去複製一份並用 copy()
修改它的內容:
// 複製對象並修改其中的屬性
val olderPerson = person1.copy(age = 35)
println(olderPerson) // 輸出: Person(name=Alice, age=35)
看範例後,各位讀者可能會想:那這樣跟我使用類別有什麼差別?除了簡潔一點、多一些酷酷的原生擴充函式外似乎、修改還要用 copy
我到底有什麼動機?
對!不得不說它跟 class
確實除上述外沒太大區別,但實質上,它提供了一個比較簡潔的介面去方便去閱讀,難道不是嗎?